|
Date : 11 aout 1991 Protection : MOT DE PASSE Programme : XENOMORPHE Outils : SOFT-ICE V2.50 Fichier : XENO.EXE Temps pass� : 1 HEURE Soci�t� : PANDORA Divers : CREATION DE FRED6.COM : et le septi�me ce week-end ! Origine : INDONESIE Num�ro : 126 Une protection disquette plus une protection mot de passe ! Je d�cide de m'attaquer � la protection mot de passe pour commencer. Les caract�res sont demand�s par l'INT 21 sous-fonction 07. Le test de la touche ENTER se fait en: 36D0:8807 CD21 INT 21 36D0:8809 3C0D CMP AL,0D 36D0:880B 7456 JZ 8863 Premi�re constatation; ce programme se modifie largement lui-m�me en fonction de la r�ponse. ( modification par des MOV CS:[xxxx],yyyy ) Si on ne r�pond rien � la demande de mot de passe ( touche ENTER seule ) on sort du programme imm�diatement car une instruction CWD fait un " pont " entre deux sous-programmes. ( le deuxi�me sous-programme sort vers le DOS ). Et dans le cas o� on rentre au moins un caract�re avant d'appuyer sur ENTER on se trouve avec une instruction RET � cet endroit: 36D0:88AF 750A JNZ 88BB ; � supprimer par un XOR BX,BX ( 33DB ) 36D0:88B1 81C3613F ADD BX,3F61 ; on doit retrouver 3F61 en BX 36D0:88B5 2E89BF7502 MOV CS:[BX+0275],DI 36D0:88BA C3 RET ; Ici on trouve un 99 ( CWD ) si on ne ; tape pas au moins un caract�re. Le contenu de BX est test� juste avant le saut conditionnel en 88AF. Le contenu de BX doit �tre � zero pour que le programme fonctionne correctement et que l'on passe par 88B1 afin de recharger BX avec 3F61. Donc deux op�rations � effectuer: 1) forcer le saut en 88AF pour qu'il passe en 88B1. 2) s'assurer que le contenu de BX contienne zero avant l'addition ou bien transformer le ADD BX,3F61 en MOV BX,3F61. Il faut �videment que le nombre des octets composant les nouvelles instructions soit identique � celui des instructions � remplacer. Une solution �l�gante permet de faire d'une pierre deux coups puisqu'en pla�ant un XOR BX,BX � la place du saut JNZ 88BB je supprime le saut et je mets le contenu de BX � zero ! Un autre probl�me survient; la chaine d'octet fait parti de la protection disquette et ne se trouve donc nul part en clair. Il ne reste plus qu'� appliquer la solution du d�tournement d'IT. L'INT 21 sous-fonction 07 ( attente de caract�re vanant du clavier ) est appel�e juste avant la demande du mot de passe. FRED6.COM est vite cr�e puisqu'il suffit de prendre un ancien FRED.COM et de modifier la valeur de IP cherch�, le mot � trouver � cette position et le nouveau mot � y mettre ( remplacer 750A par 33DB ). ; PATCH POUR LE PROGRAMME XENOMORPHE ; FREDDY_SOFT code segment org 100h assume cs:code start: jmp installe ; On va installer la routine r�sidente... cr equ 0dh lf equ 0ah flag equ 07h ; Contenu de AH devant �tre test�. adr_ip equ 88afh ; En CS:88af il suffit de mettre 33db. ( XOR BX,BX ) patch equ 0db33h ; � mettre � la place de 750A en CS:88afh ; Note: toujours inverser l'octet fort et faible ; ....Standard INTEL ! instok db cr,lf,' D�tournement de l',39,'INT 21 sous-fonction 07' db cr,lf db ' ....FREDDY_SOFT....','$' drap db 0,0 elimine db cr,lf,'J',39,'ai en principe tout remis en l',39,'�tat....' db cr,lf,'$' int21 label dword ; sauvegarde des adresses SEG:OFF de l'INT21 d'origine i40off db 0,0 ; OFFSET i40seg db 0,0 ; SEGMENT tsrint40 proc far jmp short apr�s_id db 'FR' ; On intercalle au d�but du code un identificateur apr�s_id: sti ; qui permettra de savoir si le programme est l� ! nop push ds push es push di push si push dx push cx push bx push ax cmp byte ptr [drap],1 ; Si 1 on devient transparent. jz suite ; Saut � l'INT 21 toutes fonctions valid�es. cmp ah,flag ; AH = 07. jnz suite ; Si non on traite les INT 21 normalement. mov ax,sp ; On sauve SP dans un registre, ici AX. mov cx,20 ; On essaie une vingtaine de fois... incr: pop ds ; Pour trouver le bon segment CS... dec cx jz s ; Si au bout de vingt fois on a pas r�ussi on sort... cmp word ptr ds:[adr_ip],0a75h ; en CS:88AF on a 750A. jnz incr mov word ptr ds:[adr_ip],patch mov byte ptr [drap],1h s: mov sp,ax ; On remet SS:SP d'origine. suite: pop ax ; On restaure tous les registres pop bx pop cx pop dx pop si pop di pop es pop ds pushf ; Pushf et puis un CALL pour appeler l'INT 21 ceci cli ; pour simuler une instruction INT. call int21 ; Appel de l'INT21 officielle. fin: sti ret 2 ; et on revient tsrint40 endp eor: ; ROUTINE D'INSTALLATION installe: mov ax,3521h int 21h cmp word ptr es:[bx+2],'RF' ; On teste la pr�sence de la signature. je away ; si pr�sent on d�sinstalle. mov ax,cs ; CS --> DS mov ds,ax ; DS = CS mov ax,3521h ; on detourne l'int 21h. int 21h ; sous-fonction 35. mov word ptr [i40off],bx ; L'offset se retrouve en BX. mov i40seg,es ; Le segment en ES. mov ax,2521h ; Et on met l'ad. du resident mov dx,offset tsrint40 ; sous-fonction 25 dont SEG:OFF se int 21h ; trouve en DX <---( tsrint40 ). mov dx,offset instok ; Offset du message de fin. mov ah,09 ; Sorti du message... int 21h mov ah,07 ; Attente d'un caract�re au clavier. int 21h mov dx,eor-start+100h+15 ; On r�serve la m�moire qui doit rester mov cl,4 ; en r�sident: DEBUT code - FIN code + shr dx,cl ; 100h + 15. ( 100h car les zones data mov al,0 ; sont plac�es de 0 � 100h dans un com. ; Puis d�calage de 4 � droite pour avoir ; le r�sultat en nombre de paragraphe ; + 1 ( ou + 15 comme ci-dessus ). mov ah,31h ; Sortie et reservation int 21h ; de la m�moire. away: mov dx,word ptr es:i40off ; Restauration de OFF:SEG de l'INT 21 mov ax,word ptr es:i40seg ; d'origine. mov ds,ax mov ax,2521h ; Set vecteur de l' INT 21 int 21h mov bx,es mov es,es:[2ch] mov ah,49h ; On lib�re la m�moire. int 21h mov es,bx mov ah,49h int 21h push cs ; Mettre CS dans DS pop ds mov dx,offset elimine ; pointe sur d�but du message. xor al,al mov ah,9 int 21h ; Sortir message. mov ah,4ch int 21h ; On revient au DOS. code ends end start |